package com.hhl.lamda.treamsmap;

import com.hhl.lamda.entity.Staff;
import com.hhl.lamda.entity.StaffPublic;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author HHL
 * @description
 * @date 2018/11/18 - 12:44
 */
public class StreamsMap {

    public static void main(String[] args) {

        /* A List of Strings to Uppercase */
        List<String> alpha = Arrays.asList("a", "b", "c", "d");

        //Before Java8
        List<String> alphaUpper = new ArrayList<>();
        for (String s : alpha) {
            alphaUpper.add(s.toUpperCase());
        }
        System.out.println(alpha); //[a, b, c, d]
        System.out.println(alphaUpper); //[A, B, C, D]


        // java8
        List<String> collect = alpha.stream() // 将list类型的alpha转化为stream
                .map(String::toUpperCase) // 获取遍历的list中的每一个 元素 并将遍历到的每一个字母转为 大写
                .collect(Collectors.toList()); // 收集遍历到的每一个所有字母转为 大写 的 元素并将收集到的所有元素转化为list集合
        System.out.println(collect); //[A, B, C, D]


        // Extra, streams apply to any data type.
        List<Integer> num = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> collect1 = num.stream() // 将list类型的 collect1 转化为stream
                .map(n -> n * 2) // 获取遍历的list中的每一个 元素 并将遍历到的每一个 数字 x2
                .collect(Collectors.toList()); // 收集遍历到的遍历到的每一个 数字 x2 的 元素并将收集到的所有元素转化为list集合


//    2. List of objects -> List of String
//    2.1 Get all the name values from a list of the staff objects.
        List<Staff> staffs = Arrays.asList(
                new Staff("mkyong", 30, new BigDecimal(10000)),
                new Staff("jack", 27, new BigDecimal(20000)),
                new Staff("lawrence", 33, new BigDecimal(30000))
        );


        //Before Java 8
        List<String> result = new ArrayList<>();
        for (Staff x : staffs) {
            result.add(x.getName());
        }
        System.out.println(result); //[mkyong, jack, lawrence]


        // java8
        List<String> nameList = staffs.stream() // 将list类型的staffs转化为stream
                .map(x -> x.getName()) // 获取遍历的每一个staffs的名字
                .collect(Collectors.toList()); // 收集遍历到的每一个staff的名字并将收集到的所有名字转化为list集合
        System.out.println(result); //[mkyong, jack, lawrence]


//    3. List of objects -> List of other objects
//    3.1 This example shows you how to convert a list of staff objects into a list of StaffPublic objects.
        List<StaffPublic> result1 = convertToStaffPublic(staffs);
        System.out.println(result);
    }


    private static List<StaffPublic> convertToStaffPublic(List<Staff> staff) {

        List<StaffPublic> result = new ArrayList<>();

        for (Staff temp : staff) {

            StaffPublic obj = new StaffPublic();
            obj.setName(temp.getName());
            obj.setAge(temp.getAge());
            if ("mkyong".equals(temp.getName())) {
                obj.setExtra("this field is for mkyong only!");
            }
            result.add(obj);
        }
        return result;
    }

}
